﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace DS2171Utils
{
   public class ObjectDiscover
    {

       public ObjectDiscover()
       {

       }


       /// <summary>
       /// pdllname = nome della dll con .dll compreso
       /// preleva i membri che sono di classe di un oggetto nel primo item
       /// e nel secondo item ci sono tutti i tipi in un dizionario
       /// </summary>
       public Tuple<IList<string>,  IList<KeyValuePair<string,string>> > 
           getCampiClasseOggetto(string pOggetto, string pNamespace, string pDllName)
       {
           var instance = Activator.CreateInstanceFrom(pDllName, pNamespace +"."+ pOggetto);
           //DocManagerORM.Utils.UtilsVarie.CreaIstanza("DocManagerORM.dll", "DocManagerORM.Entità.Documenti");

           var classe = instance.Unwrap();

           DynamicBindingProxy pro = new DynamicBindingProxy(classe.GetType());

           var dict = pro.getMembriTypo(classe.GetType().FullName);
           
           var FieldsTipoClassiList = dict.Keys.Where(x => dict[x].PropertyType.IsClass == true
               && (!dict[x].PropertyType.FullName.StartsWith("System."))).ToList();

           var FieldsTipiList = dict.Values.Select(x =>
               new KeyValuePair<string,string>( x.Name, x.PropertyType.UnderlyingSystemType.FullName)
               ).ToList();

           return Tuple.Create<IList<string>,IList<KeyValuePair<string,string>> >(FieldsTipoClassiList, FieldsTipiList);
       }//fM



      
       

    }//fC
}
